#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

typedef int ElemType;

// 链栈
typedef struct LNode{
    ElemType data;
    struct LNode *next;
}LNode, *LkStack;

void initStack(LkStack S); // 初始化栈
bool isEmpty(LkStack S); // 判断栈是否为空
bool push(LkStack S, ElemType data);  // 将data存入栈中
bool pop(LkStack S, ElemType* data); // 弹出栈顶元素并将值存入data中
bool getTop(LkStack S, ElemType* data); // 将栈顶元素的值存入data中


int main()
{
    LkStack S = (LkStack ) malloc(sizeof(LNode));
    initStack(S);
    for(int i = 1; i < 10; i++)
    {
        push(S, i);
    }
    ElemType data;
    for(int i = 1; i < 11; i++)
    {
        pop(S, &data);
        printf("%d ", data);
    }
    printf("\n");
    return 0;
    return 0;
}

void initStack(LkStack S)
{
    S->data = 0;
    S->next = NULL;
}

bool isEmpty(LkStack S)
{
    return S->next == NULL;
}

bool push(LkStack S, ElemType data)
{
    LNode* node = (LNode*) malloc(sizeof(LNode));
    if (node == NULL)
    {
        printf("Node creation failed\n");
        return false;
    }
    // 使用带有头结点的头插法进行插入操作
    node->next = S->next;
    node->data = data;
    S->next = node;
    return true;
}

bool pop(LkStack S, ElemType* data)
{
    if(isEmpty(S))
    {
        printf("Stack is Empty\n");
        return false;
    }
    LNode* p = S->next;
    *data = p->data;
    S->next = p->next;
    free(p);
    return true;
}

bool getTop(LkStack S, ElemType* data)
{
    if(isEmpty(S))
    {
        printf("Stack is Empty\n");
        return false;
    }
    *data = S->next->data;
    return true;
}